Introduction

We will be looking into the General Social Survey Cumulative Data also known as GSS. This data set gathers information from contemporary American Society in order to monitor and explain trends and changes in attitudes, behaviors, and attributes. This Data set has been tracking Americans since 1972 until 2018. The topics covered include civil liberties, crime & violence, intergroup tolerance, morality, national spending priorities, psychological well-being, social mobility, and stress and traumatic events. We will be exploring the whole dataset to find interesting patterns and obtain knowledge about the American population. First load all required packages and the data set.

Getting started

These are the packages utilized in this report.

Load packages

library(plotly)
library(tidyverse)
library(tidymodels)
library(dsbox)
library(patchwork)
library(drat)
library(gssr)

Load data and explore

Here we are setting up the actual data table called gss_all, we are also setting up an informative table about its variables called gss_doc.

data(gss_doc)
data(gss_all)
data_info <- gss_doc
data <- gss_all
data_info
data

Initial Observations

The 6,108 variables:

These are the few variables the data table contains

  • year: Gss year for this respondent
  • id: Respondent id number
  • wrkstat: Labor force status
  • hrs1: Number of hours worked last week
  • hrs2: Number of hours usually work a week
  • evwork: Ever work as long as one year
  • occ: census occupation code (1970)
  • prestige: occupational prestige score (1970)
  • wrkslf: self-emp or works for somebody
  • wrkgovt: Govt or private employee
  • commute: Travel time to work
  • industry: industry code (1970)

The 2867 obersvations:

There are 64,814 observations in the GSS Dataset. This can be found in two ways to find this information, using tail or nrow function.

nrow(data)
[1] 64814

Questions and Findings

Question #1: Change in political view over the years

Observing the visualization below, it is evident that the change in political view over the years has remained at a constant proportion. Looking at the proportional difference between political views in the year 1974 and 2018, one can see that the proportion remained constant, with a small rise in conservative views; though the count of each political view increased over the years, the proportion of the political views persisted staying roughly the same.

data_A1 <- filter(data, !is.na(polviews)) %>% select(year, polviews) %>% mutate(polviews = ifelse(polviews == 1|polviews ==2|polviews ==3, "Liberal", ifelse(polviews == 5|polviews ==6|polviews ==7, "Conservative", ifelse(polviews == 4, "Moderate", "polviews")))) %>% mutate(color = ifelse(polviews == "Conservative", "Red", ifelse(polviews == "Liberal", "Blue", "grey")))
data_A1 <- tibble(summarise(group_by(data_A1, year, polviews), count = n()))
colors = c('red', 'blue', 'grey')
base <- data_A1 %>%
  plot_ly(x = ~polviews, y = ~count)

base %>%
  add_bars(marker = list(color = c('red', 'blue', 'silver')), type = 'bar', frame = ~year, ids = ~polviews) %>%
  animation_opts(500, redraw = FALSE)
NA

Question #2: : A people more accepting of liberal ideas?

Here we will analyze a variety of questions to see if the aforementioned is indeed the case. Utilize visualizations to observe any trends which suggest people are more accepting of liberal ideas. The following are the questions that the respondents were asked.

Is it wrong for same-sex adults to have sexual relations?

We visualize the percentage of respondents who chose the answer “Not wrong at all” and “Always wrong” over the years.

The following two visualizations reveal that people, generally speaking, are more accepting to same-sex adults having sexual relations. Viz, the collective of society, including conservatives and moderates, are accepting of homosexual behavior; something typically characterized of being of liberal nature.

dataA2 <- select(data, year, homosex) %>% filter(!is.na(homosex))
dataA2 <- mutate(dataA2, homosex = ifelse(homosex == 4, 1, 0))
table_Not_wrong_at_all <- tibble(summarise(group_by(dataA2, year), percentage = mean(homosex) ))

dataA2 <- select(data, year, homosex) %>% filter(!is.na(homosex))
dataA2 <- mutate(dataA2, homosex = ifelse(homosex == 1, 1, 0))
table_Always_wrong <- tibble(summarise(group_by(dataA2, year), percentage = mean(homosex) ))

p_main <- ggplot(table_Not_wrong_at_all) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "red") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Question: Is it wrong for same-sex adults to have sexual relations", subtitle = "Response: Not wrong at all")

p_int <- ggplot(table_Always_wrong) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "blue") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Is it wrong for same-sex adults to have sexual relations", subtitle = "Response: Always wrong")

p_main /
p_int +
plot_layout(guides = "collect")

What are your feelings about the bible?

The respondents were to answer either “Book of fables” or “Word of god”. We will see the percentage of respondents who responded with “Book of fables” and “Word of god” over the years.

The two distributions below illustrate that the number of people believing in the bible has been decreasing over the years. People are beginning to take the bible to be a “book of fables” and disregarding the “word of god”.

dataA4 <- select(data, year, bible) %>% filter(!is.na(bible))
dataA4 <- mutate(dataA4, bible = ifelse(bible == 1, 1, 0))
table_Word_of_god <- tibble(summarise(group_by(dataA4, year), percentage = mean(bible) ))

dataA4 <- select(data, year, bible) %>% filter(!is.na(bible))
dataA4 <- mutate(dataA4, bible = ifelse(bible == 3, 1, 0))
table_Book_of_fables <- tibble(summarise(group_by(dataA4, year), percentage = mean(bible) ))

p_main <- ggplot(table_Book_of_fables) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "red") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Question: Feelings about the bible", subtitle = "Response: Book of fables")

p_int <- ggplot(table_Word_of_god) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "blue") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Question: Feelings about the bible", subtitle = "Response: Word of god")

p_main /
p_int +
plot_layout(guides = "collect")

Should a college professor who claims to be communist be fired?

The following figures show that the respondents over the years believe that a communist teacher should not be fired if he or she is a college professor.

dataA7 <- select(data, year, colcom) %>% filter(!is.na(colcom))
dataA7 <- mutate(dataA7, colcom = ifelse(colcom == 4, 1, 0))
table_fired <- tibble(summarise(group_by(dataA7, year), percentage = mean(colcom) ))

dataA7 <- select(data, year,colcom) %>% filter(!is.na(colcom))
dataA7 <- mutate(dataA7, colcom = ifelse(colcom == 5, 1, 0))
table_not_fired <- tibble(summarise(group_by(dataA7, year), percentage = mean(colcom) ))

p_main <- ggplot(table_fired) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "red") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Should communist teacher be fired", subtitle = "Response: Should Fire")

p_int <- ggplot(table_not_fired) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "blue") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Should communist teacher be fired ", subtitle = "Response: Should not Fire")

p_main /
p_int +
plot_layout(guides = "collect")

Is it wrong to have sex before marriage?

The figures below show that the percentage of people that believe that sex before marriage is acceptable has been increasing stedily throughout the years.

dataA8 <- select(data, year, premarsx) %>% filter(!is.na(premarsx))
dataA8 <- mutate(dataA8, premarsx = ifelse(premarsx == 1, 1, 0))
table_Always_wrong <- tibble(summarise(group_by(dataA8, year), percentage = mean(premarsx) ))

dataA8 <- select(data, year,premarsx) %>% filter(!is.na(premarsx))
dataA8 <- mutate(dataA8, premarsx = ifelse(premarsx == 4, 1, 0))
table_Not_wrong_at_all <- tibble(summarise(group_by(dataA8, year), percentage = mean(premarsx) ))

p_main <- ggplot(table_Always_wrong) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "red") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Is it wrong to have sex before marriage", subtitle = "Response: Always wrong")

p_int <- ggplot(table_Not_wrong_at_all) + 
  geom_line(mapping = aes(x = year, y = percentage), color = "blue") + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Is it wrong to have sex before marriage", subtitle = "Response: Not wrong at all")

p_main /
p_int +
plot_layout(guides = "collect")

Question #3: Is there a bias in political view?

In order to avoid bias, we should delve further into our findings to see whether it is only liberals who are answering the questions, or if moderates and conservatives also agree with these liberal ideas.

Should a college professor who claims to be communist be fired?

We will see the percentage of respondents of each political party over the years. The following figures illustrate that all three parties concur to the idea that a university professor who is a communist should not be fired. One can observe that the percentage of conservative acceptance of a communist professor not being fired in 1992 is equivalent to the liberal acceptance in 1980. One could purport the idea that the acceptance of a communist professor in university will have an immensely pernicious effect on society; by taking positions in education these professors will greatly impact the future of the country. Indoctrinating the youth allows one to change the course of the future.


dataA9 <- select(data, year, colcom, polviews) %>% filter(!is.na(colcom), !is.na(polviews), polviews == 1 | polviews == 2 | polviews == 3 | polviews ==4 | polviews == 5 | polviews == 6 | polviews == 7)
dataA9 <- mutate(dataA9, colcom = ifelse(colcom == 5, 1, 0)) %>% mutate(polviews = ifelse(polviews == 1|polviews ==2|polviews ==3, "Liberal", ifelse(polviews == 5|polviews ==6|polviews ==7, "Conservative", ifelse(polviews == 4, "Moderate", "polviews"))))

table_Not_fired <- tibble(summarise(group_by(dataA9, year, polviews), percentage = mean(colcom)))

ggplot(table_Not_fired) + 
  geom_line(mapping = aes(x = year, y = percentage, color = polviews)) + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Question: Should communist teacher be fired", subtitle = "Response: Not Fired") + 
  scale_color_manual(values=c("red", "blue", "dark grey"))

Is it wrong for same-sex adults to have sexual relations?

We will see the percentage of respondents of each party over the years. Similar to our previous findings, in this figure we can observe that there is a increase of acceptance regarding liberal ideas; it is self-evident that all political parties have over the years grown more leftist. Here, all three parties have grown significantly in percentage regarding the acceptance of same-sex relations.

dataA10 <- select(data, year, homosex, polviews) %>% filter(!is.na(homosex), !is.na(polviews), polviews == 1 | polviews == 2 | polviews == 3 | polviews ==4 | polviews == 5 | polviews == 6 | polviews == 7)
dataA10 <- mutate(dataA10, homosex = ifelse(homosex == 4, 1, 0)) %>% mutate(polviews = ifelse(polviews == 1|polviews ==2|polviews ==3, "Liberal", ifelse(polviews == 5|polviews ==6|polviews ==7, "Conservative", ifelse(polviews == 4, "Moderate", "polviews"))))

table_Not_wrong_at_all <- tibble(summarise(group_by(dataA10, year, polviews), percentage = mean(homosex)))

ggplot(table_Not_wrong_at_all) + 
  geom_line(mapping = aes(x = year, y = percentage, color = polviews)) + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Question: Is it wrong for same-sex adults to have sexual relations", subtitle = "Response: Not wrong at all") + 
  scale_color_manual(values=c("red", "blue", "dark grey"))

Is it wrong to have sex before marriage?

We will see the percentage of respondents of each party over the years. Again, not surprisingly, we find that all three parties have leaned towards a more liberal mindset over the years. Conservatives and moderates alike have grown to accept the liberal idea of sexual freedom and promiscuity. The percentage of conservative acceptance of sex before marriage in 2018 is equivalent to the acceptance percentage of liberals in the 1970s.

dataA11 <- select(data, year, premarsx, polviews) %>% filter(!is.na(premarsx), !is.na(polviews), polviews == 1 | polviews == 2 | polviews == 3 | polviews ==4 | polviews == 5 | polviews == 6 | polviews == 7)
dataA11 <- mutate(dataA11, premarsx = ifelse(premarsx == 4, 1, 0)) %>% mutate(polviews = ifelse(polviews == 1|polviews ==2|polviews ==3, "Liberal", ifelse(polviews == 5|polviews ==6|polviews ==7, "Conservative", ifelse(polviews == 4, "Moderate", "polviews"))))

table_Not_wrong_at_all <- tibble(summarise(group_by(dataA11, year, polviews), percentage = mean(premarsx)))

ggplot(table_Not_wrong_at_all) + 
  geom_line(mapping = aes(x = year, y = percentage, color = polviews)) + 
  scale_y_continuous(labels = scales::percent) + 
  labs(title = "Question: Is it wrong to have sex before marriage", subtitle = "Response: Not wrong at all") + 
  scale_color_manual(values=c("red", "blue", "dark grey"))

Question #4: Linear model predicting polviews

Here we created a linear model to predict polviews according to the following parameters: bible, grass (marijuana), homosex, abany (abortion), and colcom. In this linear model we get an R-squared value of 0.144 which agrees with our previous findings.

data <- filter(data, polviews == 1 | polviews == 2 | polviews == 3 | polviews ==4 | polviews == 5 | polviews == 6 | polviews == 7)
polviews_fit <- linear_reg() %>% set_engine("lm") %>% fit(polviews ~ bible + grass + homosex + abany + colcom , data)
polviews_fit %>% tidy()

glance(polviews_fit)$adj.r.squared  
[1] 0.1427118

Conclusion

The GSS gathers information from contemporary American Society in order to monitor and explain trends and changes in attitudes, behaviors, and attributes. The data provided by the GSS inventively calls for a myriad of questions. In this exploratory data analysis (EDA) we utilized a variety of functions and packages to answer some questions which we deemed interesting and didactic.

Our first question aimed to describe and visualize the change in political parties over the years. First, we had to clean the data and methodically organize it in a more succinct and understandable manner. Then, utilizing persuasive graphing tools we were able to observe the change in proportion of the political parties (Liberal, Conservative, Moderate) over the years (1974-2018). It became evident that though the proportion did face some fluctuations over the years, it nevertheless maintained a constant rate. That is to say, the distribution of people with differing political views didn’t undergo a great change over the span of 44 years.

Though the EDA conducted in question one suggested a sense of stability in the political field, we maintained some skepticism and wanted to further explore the change of political views over the years. Particularly, we aimed to probe more deeply into the data as to determine whether there were any trends towards the liberal political view. The aforementioned is precisely what we aimed to answer in question two. I.e. whether people, as a whole, are leaning towards liberal ideas.

In our EDA of the latter query we indeed found that people are collectively leaning towards liberal ideas. We identified and visualized the trend of liberal opinion in the following topics: homosexuality, religion (bible), marijuana legalization, abortion, communist educators, as well as fornication (sexual intercourse before marriage). In some of these trends we observed percentage changes as high as 40%, as in the case of marijuana legalization. While 20% of people in 1974 approved of marijuana legalization, the percentage escalated to over 60% in 2018.

Upon arriving to these findings, we decided to delve deeper into the data and explore these trends from another view point. Rather than asking whether people were leaning more towards liberal ideas, we aimed to see whether people were leaving conservative ideas and values. Comparable to question three, we approached the data similarly, and aimed to see the trends of change over the years given the same parameters as question three.

We found that from this point of analysis the same conclusion was still maintained: people are leaning towards liberal ideals. We identified that it is not only conservatives that are leaning more left, but even moderates, and liberals themselves have shifted left when compared to their 1974 counterparts. In some cases, such as when faced with the fornication topic, we found that conservatives in 2018 had the same percentage of acceptance of extramarital sex as did the liberals in the 1980s.

Given these findings, we decided to create a linear model to demonstrate the strength of correlation between the parameters investigated and that of political viewpoint. The R-square value was that of 0.144, a very insignificant amount. However, this value further verifies that our EDA was fruitful. Viz, the low R-squared value implies that these parameters assert a rather small amount of influence to that of political views. What this implies is that all three political views have skewed left towards liberal ideas in the past 44 years.

In conclusion, the findings in this EDA seem to suggest that in the past 44 years, from 1974 to 2018, public opinion and values have significantly inclined left; leaning towards a more liberal viewpoint.

LS0tCnRpdGxlOiAiR3JvdXAgRXhwbG9yYXRpb24gb2YgdGhlIEdTUyBEYXRhc2V0IgphdXRob3I6IFJ1bWkgQWxiZXJ0LCBMZWhhbiBMaSwgQWxpY2UgVGFuZwpkYXRlOiBBcHJpbCAyOCwgMjAyMAphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQpvdXRwdXQ6IAogICNwZGZfZG9jdW1lbnQ6CiAgICAjdG9jOiB5ZXMKICBodG1sX25vdGVib29rOiAgCiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgdGhlbWU6IGx1bWVuCiAgICBoaWdobGlnaHQ6IHRhbmdvCi0tLQoKIyBJbnRyb2R1Y3Rpb24KV2Ugd2lsbCBiZSBsb29raW5nIGludG8gdGhlIEdlbmVyYWwgU29jaWFsIFN1cnZleSBDdW11bGF0aXZlIERhdGEgYWxzbyBrbm93biBhcyBHU1MuIFRoaXMgZGF0YSBzZXQgZ2F0aGVycyBpbmZvcm1hdGlvbiBmcm9tIGNvbnRlbXBvcmFyeSBBbWVyaWNhbiBTb2NpZXR5IGluIG9yZGVyIHRvIG1vbml0b3IgYW5kIGV4cGxhaW4gdHJlbmRzIGFuZCBjaGFuZ2VzIGluIGF0dGl0dWRlcywgYmVoYXZpb3JzLCBhbmQgYXR0cmlidXRlcy4gVGhpcyBEYXRhIHNldCBoYXMgYmVlbiB0cmFja2luZyBBbWVyaWNhbnMgc2luY2UgMTk3MiB1bnRpbCAyMDE4LiBUaGUgdG9waWNzIGNvdmVyZWQgaW5jbHVkZSBjaXZpbCBsaWJlcnRpZXMsIGNyaW1lICYgdmlvbGVuY2UsIGludGVyZ3JvdXAgdG9sZXJhbmNlLCBtb3JhbGl0eSwgbmF0aW9uYWwgc3BlbmRpbmcgcHJpb3JpdGllcywgcHN5Y2hvbG9naWNhbCB3ZWxsLWJlaW5nLCBzb2NpYWwgbW9iaWxpdHksIGFuZCBzdHJlc3MgYW5kIHRyYXVtYXRpYyBldmVudHMuIFdlIHdpbGwgYmUgZXhwbG9yaW5nIHRoZSB3aG9sZSBkYXRhc2V0IHRvIGZpbmQgaW50ZXJlc3RpbmcgcGF0dGVybnMgYW5kIG9idGFpbiBrbm93bGVkZ2UgYWJvdXQgdGhlIEFtZXJpY2FuIHBvcHVsYXRpb24uIEZpcnN0IGxvYWQgYWxsIHJlcXVpcmVkIHBhY2thZ2VzIGFuZCB0aGUgZGF0YSBzZXQuCgojIyBHZXR0aW5nIHN0YXJ0ZWQKClRoZXNlIGFyZSB0aGUgcGFja2FnZXMgdXRpbGl6ZWQgaW4gdGhpcyByZXBvcnQuCgojIyMgTG9hZCBwYWNrYWdlcyAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShwbG90bHkpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZHltb2RlbHMpCmxpYnJhcnkoZHNib3gpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGRyYXQpCmxpYnJhcnkoZ3NzcikKYGBgCiMjIyBMb2FkIGRhdGEgYW5kIGV4cGxvcmUKCkhlcmUgd2UgYXJlIHNldHRpbmcgdXAgdGhlIGFjdHVhbCBkYXRhIHRhYmxlIGNhbGxlZCBnc3NfYWxsLCB3ZSBhcmUgYWxzbyBzZXR0aW5nIHVwIGFuIGluZm9ybWF0aXZlIHRhYmxlIGFib3V0IGl0cyB2YXJpYWJsZXMgY2FsbGVkIGdzc19kb2MuCmBgYHtyfQpkYXRhKGdzc19kb2MpCmRhdGEoZ3NzX2FsbCkKZGF0YV9pbmZvIDwtIGdzc19kb2MKZGF0YSA8LSBnc3NfYWxsCmRhdGFfaW5mbwpkYXRhCmBgYAoKIyMgSW5pdGlhbCBPYnNlcnZhdGlvbnMgCgojIyMgVGhlIDYsMTA4IHZhcmlhYmxlczogClRoZXNlIGFyZSB0aGUgZmV3IHZhcmlhYmxlcyB0aGUgZGF0YSB0YWJsZSBjb250YWlucyAgIAoKICArIHllYXI6IEdzcyB5ZWFyIGZvciB0aGlzIHJlc3BvbmRlbnQKICArIGlkOiBSZXNwb25kZW50IGlkIG51bWJlcgogICsgd3Jrc3RhdDogTGFib3IgZm9yY2Ugc3RhdHVzCiAgKyBocnMxOiBOdW1iZXIgb2YgaG91cnMgd29ya2VkIGxhc3Qgd2VlawogICsgaHJzMjogTnVtYmVyIG9mIGhvdXJzIHVzdWFsbHkgd29yayBhIHdlZWsKICArIGV2d29yazogRXZlciB3b3JrIGFzIGxvbmcgYXMgb25lIHllYXIKICArIG9jYzogY2Vuc3VzIG9jY3VwYXRpb24gY29kZSAoMTk3MCkKICArIHByZXN0aWdlOiBvY2N1cGF0aW9uYWwgcHJlc3RpZ2Ugc2NvcmUgKDE5NzApCiAgKyB3cmtzbGY6IHNlbGYtZW1wIG9yIHdvcmtzIGZvciBzb21lYm9keQogICsgd3JrZ292dDogR292dCBvciBwcml2YXRlIGVtcGxveWVlCiAgKyBjb21tdXRlOiBUcmF2ZWwgdGltZSB0byB3b3JrCiAgKyBpbmR1c3RyeTogaW5kdXN0cnkgY29kZSAoMTk3MCkgCiAgCiMjIyBUaGUgMjg2NyBvYmVyc3ZhdGlvbnM6ClRoZXJlIGFyZSA2NCw4MTQgb2JzZXJ2YXRpb25zIGluIHRoZSBHU1MgRGF0YXNldC4gVGhpcyBjYW4gYmUgZm91bmQgaW4gdHdvIHdheXMgdG8gZmluZCB0aGlzIGluZm9ybWF0aW9uLCB1c2luZyB0YWlsIG9yIG5yb3cgZnVuY3Rpb24uIApgYGB7cn0KbnJvdyhkYXRhKQpgYGAKCiMgUXVlc3Rpb25zIGFuZCBGaW5kaW5ncwoKIyMgUXVlc3Rpb24gIzE6IENoYW5nZSBpbiBwb2xpdGljYWwgdmlldyBvdmVyIHRoZSB5ZWFycwoKT2JzZXJ2aW5nIHRoZSB2aXN1YWxpemF0aW9uIGJlbG93LCBpdCBpcyBldmlkZW50IHRoYXQgdGhlIGNoYW5nZSBpbiBwb2xpdGljYWwgdmlldyBvdmVyIHRoZSB5ZWFycyBoYXMgcmVtYWluZWQgYXQgYSBjb25zdGFudCBwcm9wb3J0aW9uLiBMb29raW5nIGF0IHRoZSBwcm9wb3J0aW9uYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHBvbGl0aWNhbCB2aWV3cyBpbiB0aGUgeWVhciAxOTc0IGFuZCAyMDE4LCBvbmUgY2FuIHNlZSB0aGF0IHRoZSBwcm9wb3J0aW9uIHJlbWFpbmVkIGNvbnN0YW50LCB3aXRoIGEgc21hbGwgcmlzZSBpbiBjb25zZXJ2YXRpdmUgdmlld3M7IHRob3VnaCB0aGUgY291bnQgb2YgZWFjaCBwb2xpdGljYWwgdmlldyBpbmNyZWFzZWQgb3ZlciB0aGUgeWVhcnMsIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb2xpdGljYWwgdmlld3MgcGVyc2lzdGVkIHN0YXlpbmcgcm91Z2hseSB0aGUgc2FtZS4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGFfQTEgPC0gZmlsdGVyKGRhdGEsICFpcy5uYShwb2x2aWV3cykpICU+JSBzZWxlY3QoeWVhciwgcG9sdmlld3MpICU+JSBtdXRhdGUocG9sdmlld3MgPSBpZmVsc2UocG9sdmlld3MgPT0gMXxwb2x2aWV3cyA9PTJ8cG9sdmlld3MgPT0zLCAiTGliZXJhbCIsIGlmZWxzZShwb2x2aWV3cyA9PSA1fHBvbHZpZXdzID09Nnxwb2x2aWV3cyA9PTcsICJDb25zZXJ2YXRpdmUiLCBpZmVsc2UocG9sdmlld3MgPT0gNCwgIk1vZGVyYXRlIiwgInBvbHZpZXdzIikpKSkgJT4lIG11dGF0ZShjb2xvciA9IGlmZWxzZShwb2x2aWV3cyA9PSAiQ29uc2VydmF0aXZlIiwgIlJlZCIsIGlmZWxzZShwb2x2aWV3cyA9PSAiTGliZXJhbCIsICJCbHVlIiwgImdyZXkiKSkpCmRhdGFfQTEgPC0gdGliYmxlKHN1bW1hcmlzZShncm91cF9ieShkYXRhX0ExLCB5ZWFyLCBwb2x2aWV3cyksIGNvdW50ID0gbigpKSkKY29sb3JzID0gYygncmVkJywgJ2JsdWUnLCAnZ3JleScpCmJhc2UgPC0gZGF0YV9BMSAlPiUKICBwbG90X2x5KHggPSB+cG9sdmlld3MsIHkgPSB+Y291bnQpCgpiYXNlICU+JQogIGFkZF9iYXJzKG1hcmtlciA9IGxpc3QoY29sb3IgPSBjKCdyZWQnLCAnYmx1ZScsICdzaWx2ZXInKSksIHR5cGUgPSAnYmFyJywgZnJhbWUgPSB+eWVhciwgaWRzID0gfnBvbHZpZXdzKSAlPiUKICBhbmltYXRpb25fb3B0cyg1MDAsIHJlZHJhdyA9IEZBTFNFKQoKYGBgCgoKIyMgUXVlc3Rpb24gIzI6ICA6ICBBIHBlb3BsZSBtb3JlIGFjY2VwdGluZyBvZiBsaWJlcmFsIGlkZWFzPwpIZXJlIHdlIHdpbGwgYW5hbHl6ZSBhIHZhcmlldHkgb2YgcXVlc3Rpb25zIHRvIHNlZSBpZiB0aGUgYWZvcmVtZW50aW9uZWQgaXMgaW5kZWVkIHRoZSBjYXNlLiBVdGlsaXplIHZpc3VhbGl6YXRpb25zIHRvIG9ic2VydmUgYW55IHRyZW5kcyB3aGljaCBzdWdnZXN0IHBlb3BsZSBhcmUgbW9yZSBhY2NlcHRpbmcgb2YgbGliZXJhbCBpZGVhcy4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHF1ZXN0aW9ucyB0aGF0IHRoZSByZXNwb25kZW50cyB3ZXJlIGFza2VkLgoKIyMjIElzIGl0IHdyb25nIGZvciBzYW1lLXNleCBhZHVsdHMgdG8gaGF2ZSBzZXh1YWwgcmVsYXRpb25zPyAKV2UgdmlzdWFsaXplIHRoZSBwZXJjZW50YWdlIG9mIHJlc3BvbmRlbnRzIHdobyBjaG9zZSB0aGUgYW5zd2VyICJOb3Qgd3JvbmcgYXQgYWxsIiBhbmQgIkFsd2F5cyB3cm9uZyIgb3ZlciB0aGUgeWVhcnMuCgpUaGUgZm9sbG93aW5nIHR3byB2aXN1YWxpemF0aW9ucyByZXZlYWwgdGhhdCBwZW9wbGUsIGdlbmVyYWxseSBzcGVha2luZywgYXJlIG1vcmUgYWNjZXB0aW5nIHRvIHNhbWUtc2V4IGFkdWx0cyBoYXZpbmcgc2V4dWFsIHJlbGF0aW9ucy4gVml6LCB0aGUgY29sbGVjdGl2ZSBvZiBzb2NpZXR5LCBpbmNsdWRpbmcgY29uc2VydmF0aXZlcyBhbmQgbW9kZXJhdGVzLCBhcmUgYWNjZXB0aW5nIG9mIGhvbW9zZXh1YWwgYmVoYXZpb3I7IHNvbWV0aGluZyB0eXBpY2FsbHkgY2hhcmFjdGVyaXplZCBvZiBiZWluZyBvZiBsaWJlcmFsIG5hdHVyZS4KCmBgYHtyfQpkYXRhQTIgPC0gc2VsZWN0KGRhdGEsIHllYXIsIGhvbW9zZXgpICU+JSBmaWx0ZXIoIWlzLm5hKGhvbW9zZXgpKQpkYXRhQTIgPC0gbXV0YXRlKGRhdGFBMiwgaG9tb3NleCA9IGlmZWxzZShob21vc2V4ID09IDQsIDEsIDApKQp0YWJsZV9Ob3Rfd3JvbmdfYXRfYWxsIDwtIHRpYmJsZShzdW1tYXJpc2UoZ3JvdXBfYnkoZGF0YUEyLCB5ZWFyKSwgcGVyY2VudGFnZSA9IG1lYW4oaG9tb3NleCkgKSkKCmRhdGFBMiA8LSBzZWxlY3QoZGF0YSwgeWVhciwgaG9tb3NleCkgJT4lIGZpbHRlcighaXMubmEoaG9tb3NleCkpCmRhdGFBMiA8LSBtdXRhdGUoZGF0YUEyLCBob21vc2V4ID0gaWZlbHNlKGhvbW9zZXggPT0gMSwgMSwgMCkpCnRhYmxlX0Fsd2F5c193cm9uZyA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBMiwgeWVhciksIHBlcmNlbnRhZ2UgPSBtZWFuKGhvbW9zZXgpICkpCgpwX21haW4gPC0gZ2dwbG90KHRhYmxlX05vdF93cm9uZ19hdF9hbGwpICsgCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlKSwgY29sb3IgPSAicmVkIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiUXVlc3Rpb246IElzIGl0IHdyb25nIGZvciBzYW1lLXNleCBhZHVsdHMgdG8gaGF2ZSBzZXh1YWwgcmVsYXRpb25zIiwgc3VidGl0bGUgPSAiUmVzcG9uc2U6IE5vdCB3cm9uZyBhdCBhbGwiKQoKcF9pbnQgPC0gZ2dwbG90KHRhYmxlX0Fsd2F5c193cm9uZykgKyAKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0geWVhciwgeSA9IHBlcmNlbnRhZ2UpLCBjb2xvciA9ICJibHVlIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiSXMgaXQgd3JvbmcgZm9yIHNhbWUtc2V4IGFkdWx0cyB0byBoYXZlIHNleHVhbCByZWxhdGlvbnMiLCBzdWJ0aXRsZSA9ICJSZXNwb25zZTogQWx3YXlzIHdyb25nIikKCnBfbWFpbiAvCnBfaW50ICsKcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKQoKYGBgCgoKIyMjIFdoYXQgYXJlIHlvdXIgZmVlbGluZ3MgYWJvdXQgdGhlIGJpYmxlPwpUaGUgcmVzcG9uZGVudHMgd2VyZSB0byBhbnN3ZXIgZWl0aGVyIOKAnEJvb2sgb2YgZmFibGVz4oCdIG9yIOKAnFdvcmQgb2YgZ29k4oCdLiAKV2Ugd2lsbCBzZWUgdGhlIHBlcmNlbnRhZ2Ugb2YgcmVzcG9uZGVudHMgd2hvIHJlc3BvbmRlZCB3aXRoICJCb29rIG9mIGZhYmxlcyIgYW5kICJXb3JkIG9mIGdvZCIgb3ZlciB0aGUgeWVhcnMuCgpUaGUgdHdvIGRpc3RyaWJ1dGlvbnMgYmVsb3cgaWxsdXN0cmF0ZSB0aGF0IHRoZSBudW1iZXIgb2YgcGVvcGxlIGJlbGlldmluZyBpbiB0aGUgYmlibGUgaGFzIGJlZW4gZGVjcmVhc2luZyBvdmVyIHRoZSB5ZWFycy4gUGVvcGxlIGFyZSBiZWdpbm5pbmcgdG8gdGFrZSB0aGUgYmlibGUgdG8gYmUgYSDigJxib29rIG9mIGZhYmxlc+KAnSBhbmQgZGlzcmVnYXJkaW5nIHRoZSDigJx3b3JkIG9mIGdvZOKAnS4KCmBgYHtyfQpkYXRhQTQgPC0gc2VsZWN0KGRhdGEsIHllYXIsIGJpYmxlKSAlPiUgZmlsdGVyKCFpcy5uYShiaWJsZSkpCmRhdGFBNCA8LSBtdXRhdGUoZGF0YUE0LCBiaWJsZSA9IGlmZWxzZShiaWJsZSA9PSAxLCAxLCAwKSkKdGFibGVfV29yZF9vZl9nb2QgPC0gdGliYmxlKHN1bW1hcmlzZShncm91cF9ieShkYXRhQTQsIHllYXIpLCBwZXJjZW50YWdlID0gbWVhbihiaWJsZSkgKSkKCmRhdGFBNCA8LSBzZWxlY3QoZGF0YSwgeWVhciwgYmlibGUpICU+JSBmaWx0ZXIoIWlzLm5hKGJpYmxlKSkKZGF0YUE0IDwtIG11dGF0ZShkYXRhQTQsIGJpYmxlID0gaWZlbHNlKGJpYmxlID09IDMsIDEsIDApKQp0YWJsZV9Cb29rX29mX2ZhYmxlcyA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBNCwgeWVhciksIHBlcmNlbnRhZ2UgPSBtZWFuKGJpYmxlKSApKQoKcF9tYWluIDwtIGdncGxvdCh0YWJsZV9Cb29rX29mX2ZhYmxlcykgKyAKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0geWVhciwgeSA9IHBlcmNlbnRhZ2UpLCBjb2xvciA9ICJyZWQiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgCiAgbGFicyh0aXRsZSA9ICJRdWVzdGlvbjogRmVlbGluZ3MgYWJvdXQgdGhlIGJpYmxlIiwgc3VidGl0bGUgPSAiUmVzcG9uc2U6IEJvb2sgb2YgZmFibGVzIikKCnBfaW50IDwtIGdncGxvdCh0YWJsZV9Xb3JkX29mX2dvZCkgKyAKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0geWVhciwgeSA9IHBlcmNlbnRhZ2UpLCBjb2xvciA9ICJibHVlIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiUXVlc3Rpb246IEZlZWxpbmdzIGFib3V0IHRoZSBiaWJsZSIsIHN1YnRpdGxlID0gIlJlc3BvbnNlOiBXb3JkIG9mIGdvZCIpCgpwX21haW4gLwpwX2ludCArCnBsb3RfbGF5b3V0KGd1aWRlcyA9ICJjb2xsZWN0IikKYGBgCgoKIyMjIFNob3VsZCBtYXJpanVhbmEgYmUgbWFkZSBsZWdhbD8KV2Ugd2lsbCBhbmFseXplIHRoZSBwZXJjZW50YWdlIG9mIHJlc3BvbmRlbnRzIHdobyByZXNwb25kZWQgd2l0aCAiTGVnYWwiIGFuZCAiTm90IExlZ2FsIiBvdmVyIHRoZSB5ZWFycy4KVGhlIHZpc3VhbGl6YXRpb25zIGJlbG93IGluZm9ybSB1cyBvZiBhbiBldmlkZW50IHNvY2lhbCBvcGluaW9uOiB0aGF0IG1hcmlqdWFuYSBzaG91bGQgYmUgbGVnYWxpemVkLiBUaGUgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2hvIGJlbGlldmUgbWFyaWp1YW5hIHNob3VsZCBub3QgYmUgaWxsZWdhbCwgYW5kIHNob3VsZCBpbnN0ZWFkIGJlIGxlZ2FsaXplZCBoYXMgaW5jcmVhc2VkIGRyYW1hdGljYWxseSBzaW5jZSAxOTgwLgoKYGBge3J9CmRhdGFBNSA8LSBzZWxlY3QoZGF0YSwgeWVhciwgZ3Jhc3MpICU+JSBmaWx0ZXIoIWlzLm5hKGdyYXNzKSkKZGF0YUE1IDwtIG11dGF0ZShkYXRhQTUsIGdyYXNzID0gaWZlbHNlKGdyYXNzID09IDEsIDEsIDApKQp0YWJsZV9MZWdhbCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBNSwgeWVhciksIHBlcmNlbnRhZ2UgPSBtZWFuKGdyYXNzKSApKQoKZGF0YUE1IDwtIHNlbGVjdChkYXRhLCB5ZWFyLCBncmFzcykgJT4lIGZpbHRlcighaXMubmEoZ3Jhc3MpKQpkYXRhQTUgPC0gbXV0YXRlKGRhdGFBNSwgZ3Jhc3MgPSBpZmVsc2UoZ3Jhc3MgPT0gMiwgMSwgMCkpCnRhYmxlX05vdF9MZWdhbCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBNSwgeWVhciksIHBlcmNlbnRhZ2UgPSBtZWFuKGdyYXNzKSApKQoKcF9tYWluIDwtIGdncGxvdCh0YWJsZV9MZWdhbCkgKyAKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0geWVhciwgeSA9IHBlcmNlbnRhZ2UpLCBjb2xvciA9ICJyZWQiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgCiAgbGFicyh0aXRsZSA9ICJRdWVzdGlvbjogU2hvdWxkIG1hcmlqdWFuYSBiZSBtYWRlIGxlZ2FsIiwgc3VidGl0bGUgPSAiUmVzcG9uc2U6IExlZ2FsIikKCnBfaW50IDwtIGdncGxvdCh0YWJsZV9Ob3RfTGVnYWwpICsgCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlKSwgY29sb3IgPSAiYmx1ZSIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBsYWJzKHRpdGxlID0gIlF1ZXN0aW9uOiBTaG91bGQgbWFyaWp1YW5hIGJlIG1hZGUgbGVnYWwiLCBzdWJ0aXRsZSA9ICJSZXNwb25zZTogTm90IExlZ2FsIikKCnBfbWFpbiAvCnBfaW50ICsKcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKQpgYGAKCgojIyMgU2hvdWxkIGEgcHJlZ25hbnQgd29tYW4gb2J0YWluIGEgbGVnYWwgYWJvcnRpb24gaWYgdGhlIHdvbWFuIHdhbnRzIGl0IGZvciBhbnkgcmVhc29uPwpXZSB3aWxsIGFuYWx5emUgdGhlIHBlcmNlbnRhZ2Ugb2YgcmVzcG9uZGVudHMgd2hvIHJlc3BvbmRlZCB3aXRoICJzaG91bGQiIGFuZCAic2hvdWxkIG5vdCIgdG8gdGhpcyBxdWVzdGlvbiBvdmVyIHRoZSB5ZWFycy4KVGhlIGZvbGxvd2luZyBmaWd1cmVzIGluZm9ybSB1cyB0aGF0IGFzIGEgd2hvbGUsIHRoZSBwZXJjZW50YWdlIG9mIHJlc3BvbmRlbnRzIHdobyBiZWxpZXZlIHRoYXQgYWJvcnRpb24gc2hvdWxkIGJlIHBvc3NpYmxlIGZvciBhIHByZWduYW50IHdvbWFuIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlYXNvbiBoYXMgaW5jcmVhc2VkIHJlbWFya2FibHkuCgpgYGB7cn0KZGF0YUE2IDwtIHNlbGVjdChkYXRhLCB5ZWFyLCBhYmFueSkgJT4lIGZpbHRlcighaXMubmEoYWJhbnkpKQpkYXRhQTYgPC0gbXV0YXRlKGRhdGFBNiwgYWJhbnkgPSBpZmVsc2UoYWJhbnkgPT0gMSwgMSwgMCkpCnRhYmxlX3Nob3VsZCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBNiwgeWVhciksIHBlcmNlbnRhZ2UgPSBtZWFuKGFiYW55KSApKQoKZGF0YUE2IDwtIHNlbGVjdChkYXRhLCB5ZWFyLGFiYW55KSAlPiUgZmlsdGVyKCFpcy5uYShhYmFueSkpCmRhdGFBNiA8LSBtdXRhdGUoZGF0YUE2LCBhYmFueSA9IGlmZWxzZShhYmFueSA9PSAyLCAxLCAwKSkKdGFibGVfc2hvdWxkX25vdCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBNiwgeWVhciksIHBlcmNlbnRhZ2UgPSBtZWFuKGFiYW55KSApKQoKcF9tYWluIDwtIGdncGxvdCh0YWJsZV9zaG91bGQpICsgCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlKSwgY29sb3IgPSAicmVkIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiQWJvcnRpb24gaWYgd29tYW4gd2FudHMgZm9yIGFueSByZWFzb24gIiwgc3VidGl0bGUgPSAiUmVzcG9uc2U6IFNob3VsZCIpCgpwX2ludCA8LSBnZ3Bsb3QodGFibGVfc2hvdWxkX25vdCkgKyAKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0geWVhciwgeSA9IHBlcmNlbnRhZ2UpLCBjb2xvciA9ICJibHVlIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiQWJvcnRpb24gaWYgd29tYW4gd2FudHMgZm9yIGFueSByZWFzb24gIiwgc3VidGl0bGUgPSAiUmVzcG9uc2U6IFNob3VsZCBOb3QiKQoKcF9tYWluIC8KcF9pbnQgKwpwbG90X2xheW91dChndWlkZXMgPSAiY29sbGVjdCIpCmBgYAoKCiMjIyAgU2hvdWxkIGEgY29sbGVnZSBwcm9mZXNzb3Igd2hvIGNsYWltcyB0byBiZSBjb21tdW5pc3QgYmUgZmlyZWQ/ClRoZSBmb2xsb3dpbmcgZmlndXJlcyBzaG93IHRoYXQgdGhlIHJlc3BvbmRlbnRzIG92ZXIgdGhlIHllYXJzIGJlbGlldmUgdGhhdCBhIGNvbW11bmlzdCB0ZWFjaGVyIHNob3VsZCBub3QgYmUgZmlyZWQgaWYgaGUgb3Igc2hlIGlzIGEgY29sbGVnZSBwcm9mZXNzb3IuCgpgYGB7cn0KZGF0YUE3IDwtIHNlbGVjdChkYXRhLCB5ZWFyLCBjb2xjb20pICU+JSBmaWx0ZXIoIWlzLm5hKGNvbGNvbSkpCmRhdGFBNyA8LSBtdXRhdGUoZGF0YUE3LCBjb2xjb20gPSBpZmVsc2UoY29sY29tID09IDQsIDEsIDApKQp0YWJsZV9maXJlZCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBNywgeWVhciksIHBlcmNlbnRhZ2UgPSBtZWFuKGNvbGNvbSkgKSkKCmRhdGFBNyA8LSBzZWxlY3QoZGF0YSwgeWVhcixjb2xjb20pICU+JSBmaWx0ZXIoIWlzLm5hKGNvbGNvbSkpCmRhdGFBNyA8LSBtdXRhdGUoZGF0YUE3LCBjb2xjb20gPSBpZmVsc2UoY29sY29tID09IDUsIDEsIDApKQp0YWJsZV9ub3RfZmlyZWQgPC0gdGliYmxlKHN1bW1hcmlzZShncm91cF9ieShkYXRhQTcsIHllYXIpLCBwZXJjZW50YWdlID0gbWVhbihjb2xjb20pICkpCgpwX21haW4gPC0gZ2dwbG90KHRhYmxlX2ZpcmVkKSArIAogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB5ZWFyLCB5ID0gcGVyY2VudGFnZSksIGNvbG9yID0gInJlZCIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBsYWJzKHRpdGxlID0gIlNob3VsZCBjb21tdW5pc3QgdGVhY2hlciBiZSBmaXJlZCIsIHN1YnRpdGxlID0gIlJlc3BvbnNlOiBTaG91bGQgRmlyZSIpCgpwX2ludCA8LSBnZ3Bsb3QodGFibGVfbm90X2ZpcmVkKSArIAogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB5ZWFyLCB5ID0gcGVyY2VudGFnZSksIGNvbG9yID0gImJsdWUiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgCiAgbGFicyh0aXRsZSA9ICJTaG91bGQgY29tbXVuaXN0IHRlYWNoZXIgYmUgZmlyZWQgIiwgc3VidGl0bGUgPSAiUmVzcG9uc2U6IFNob3VsZCBub3QgRmlyZSIpCgpwX21haW4gLwpwX2ludCArCnBsb3RfbGF5b3V0KGd1aWRlcyA9ICJjb2xsZWN0IikKYGBgCgojIyMgSXMgaXQgd3JvbmcgdG8gaGF2ZSBzZXggYmVmb3JlIG1hcnJpYWdlPwpUaGUgZmlndXJlcyBiZWxvdyBzaG93IHRoYXQgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHRoYXQgYmVsaWV2ZSB0aGF0IHNleCBiZWZvcmUgbWFycmlhZ2UgaXMgYWNjZXB0YWJsZSBoYXMgYmVlbiBpbmNyZWFzaW5nIHN0ZWRpbHkgdGhyb3VnaG91dCB0aGUgeWVhcnMuCmBgYHtyfQpkYXRhQTggPC0gc2VsZWN0KGRhdGEsIHllYXIsIHByZW1hcnN4KSAlPiUgZmlsdGVyKCFpcy5uYShwcmVtYXJzeCkpCmRhdGFBOCA8LSBtdXRhdGUoZGF0YUE4LCBwcmVtYXJzeCA9IGlmZWxzZShwcmVtYXJzeCA9PSAxLCAxLCAwKSkKdGFibGVfQWx3YXlzX3dyb25nIDwtIHRpYmJsZShzdW1tYXJpc2UoZ3JvdXBfYnkoZGF0YUE4LCB5ZWFyKSwgcGVyY2VudGFnZSA9IG1lYW4ocHJlbWFyc3gpICkpCgpkYXRhQTggPC0gc2VsZWN0KGRhdGEsIHllYXIscHJlbWFyc3gpICU+JSBmaWx0ZXIoIWlzLm5hKHByZW1hcnN4KSkKZGF0YUE4IDwtIG11dGF0ZShkYXRhQTgsIHByZW1hcnN4ID0gaWZlbHNlKHByZW1hcnN4ID09IDQsIDEsIDApKQp0YWJsZV9Ob3Rfd3JvbmdfYXRfYWxsIDwtIHRpYmJsZShzdW1tYXJpc2UoZ3JvdXBfYnkoZGF0YUE4LCB5ZWFyKSwgcGVyY2VudGFnZSA9IG1lYW4ocHJlbWFyc3gpICkpCgpwX21haW4gPC0gZ2dwbG90KHRhYmxlX0Fsd2F5c193cm9uZykgKyAKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0geWVhciwgeSA9IHBlcmNlbnRhZ2UpLCBjb2xvciA9ICJyZWQiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgCiAgbGFicyh0aXRsZSA9ICJJcyBpdCB3cm9uZyB0byBoYXZlIHNleCBiZWZvcmUgbWFycmlhZ2UiLCBzdWJ0aXRsZSA9ICJSZXNwb25zZTogQWx3YXlzIHdyb25nIikKCnBfaW50IDwtIGdncGxvdCh0YWJsZV9Ob3Rfd3JvbmdfYXRfYWxsKSArIAogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB5ZWFyLCB5ID0gcGVyY2VudGFnZSksIGNvbG9yID0gImJsdWUiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgCiAgbGFicyh0aXRsZSA9ICJJcyBpdCB3cm9uZyB0byBoYXZlIHNleCBiZWZvcmUgbWFycmlhZ2UiLCBzdWJ0aXRsZSA9ICJSZXNwb25zZTogTm90IHdyb25nIGF0IGFsbCIpCgpwX21haW4gLwpwX2ludCArCnBsb3RfbGF5b3V0KGd1aWRlcyA9ICJjb2xsZWN0IikKYGBgCgoKCiMjIFF1ZXN0aW9uICMzOiBJcyB0aGVyZSBhIGJpYXMgaW4gcG9saXRpY2FsIHZpZXc/CkluIG9yZGVyIHRvIGF2b2lkIGJpYXMsIHdlIHNob3VsZCBkZWx2ZSBmdXJ0aGVyIGludG8gb3VyIGZpbmRpbmdzIHRvIHNlZSB3aGV0aGVyIGl0IGlzIG9ubHkgbGliZXJhbHMgd2hvIGFyZSBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9ucywgb3IgaWYgbW9kZXJhdGVzIGFuZCBjb25zZXJ2YXRpdmVzIGFsc28gYWdyZWUgd2l0aCB0aGVzZSBsaWJlcmFsIGlkZWFzLiAKCiMjIyBTaG91bGQgbWFyaWp1YW5hIGJlIG1hZGUgbGVnYWw/CldlIHdpbGwgb2JzZXJ2ZSB0aGUgcGVyY2VudGFnZSBvZiByZXNwb25kZW50cyBvZiBlYWNoIHBhcnR5IG92ZXIgdGhlIHllYXJzLgpUaGUgZm9sbG93aW5nIGZpZ3VyZSBpbGx1c3RyYXRlcyB0aGF0IGFsbCB0aHJlZSBwb2xpdGljYWwgdmlld3M6IGNvbnNlcnZhdGl2ZSwgbGliZXJhbCwgYW5kIG1vZGVyYXRlIGFsbCBzdXBwb3J0IHRoZSBsZWdhbGl6YXRpb24gb2YgbWFyaWp1YW5hLiBUaGUgcGVyY2VudGFnZSBvZiB0aGlzIGFncmVlbWVudCBoYXMgZ3Jvd24gcmVtYXJrYWJseS4gSW4gcmVnYXJkIHRvIG1hcmlqdWFuYSBsZWdhbGl6YXRpb24sIHRoZSBwZXJjZW50YWdlIG9mIGxpYmVyYWwgYWNjZXB0YW5jZSBvZiBzdWNoIGxlZ2FsaXphdGlvbiBpcyBhdCB0aGUgc2FtZSBsZXZlbCBhcyBjb25zZXJ2YXRpdmUgYWNjZXB0YW5jZSBpbiAyMDA3LgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGF0YUE1IDwtIHNlbGVjdChkYXRhLCB5ZWFyLCBncmFzcywgcG9sdmlld3MpICU+JSBmaWx0ZXIoIWlzLm5hKGdyYXNzKSwgIWlzLm5hKHBvbHZpZXdzKSwgcG9sdmlld3MgPT0gMSB8cG9sdmlld3MgPT0gMiB8cG9sdmlld3MgPT0gMyB8cG9sdmlld3MgPT00IHxwb2x2aWV3cyA9PSA1IHwgcG9sdmlld3MgPT0gNiB8IHBvbHZpZXdzID09IDcpCmRhdGFBNSA8LSBtdXRhdGUoZGF0YUE1LCBncmFzcyA9IGlmZWxzZShncmFzcyA9PSAxLCAxLCAwKSkgJT4lIG11dGF0ZShwb2x2aWV3cyA9IGlmZWxzZShwb2x2aWV3cyA9PSAxfHBvbHZpZXdzID09Mnxwb2x2aWV3cyA9PTMsICJMaWJlcmFsIiwgaWZlbHNlKHBvbHZpZXdzID09IDV8cG9sdmlld3MgPT02fHBvbHZpZXdzID09NywgIkNvbnNlcnZhdGl2ZSIsIGlmZWxzZShwb2x2aWV3cyA9PSA0LCAiTW9kZXJhdGUiLCAicG9sdmlld3MiKSkpKQoKdGFibGVfTGVnYWwgPC0gdGliYmxlKHN1bW1hcmlzZShncm91cF9ieShkYXRhQTUsIHllYXIsIHBvbHZpZXdzKSwgcGVyY2VudGFnZSA9IG1lYW4oZ3Jhc3MpICkpCgpnZ3Bsb3QodGFibGVfTGVnYWwpICsgCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlLCBjb2xvciA9IHBvbHZpZXdzKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiUXVlc3Rpb246IFNob3VsZCBtYXJpanVhbmEgYmUgbWFkZSBsZWdhbCIsIHN1YnRpdGxlID0gIlJlc3BvbnNlOiBMZWdhbCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJyZWQiLCAiYmx1ZSIsICJkYXJrIGdyZXkiKSkKYGBgCgojIyMgU2hvdWxkIGEgY29sbGVnZSBwcm9mZXNzb3Igd2hvIGNsYWltcyB0byBiZSBjb21tdW5pc3QgYmUgZmlyZWQ/CldlIHdpbGwgc2VlIHRoZSBwZXJjZW50YWdlIG9mIHJlc3BvbmRlbnRzIG9mIGVhY2ggcG9saXRpY2FsIHBhcnR5IG92ZXIgdGhlIHllYXJzLgpUaGUgZm9sbG93aW5nIGZpZ3VyZXMgaWxsdXN0cmF0ZSB0aGF0IGFsbCB0aHJlZSBwYXJ0aWVzIGNvbmN1ciB0byB0aGUgaWRlYSB0aGF0IGEgdW5pdmVyc2l0eSBwcm9mZXNzb3Igd2hvIGlzIGEgY29tbXVuaXN0IHNob3VsZCBub3QgYmUgZmlyZWQuIE9uZSBjYW4gb2JzZXJ2ZSB0aGF0IHRoZSBwZXJjZW50YWdlIG9mIGNvbnNlcnZhdGl2ZSBhY2NlcHRhbmNlIG9mIGEgY29tbXVuaXN0IHByb2Zlc3NvciBub3QgYmVpbmcgZmlyZWQgaW4gMTk5MiBpcyBlcXVpdmFsZW50IHRvIHRoZSBsaWJlcmFsIGFjY2VwdGFuY2UgaW4gMTk4MC4gT25lIGNvdWxkIHB1cnBvcnQgdGhlIGlkZWEgdGhhdCB0aGUgYWNjZXB0YW5jZSBvZiBhIGNvbW11bmlzdCBwcm9mZXNzb3IgaW4gdW5pdmVyc2l0eSB3aWxsIGhhdmUgYW4gaW1tZW5zZWx5IHBlcm5pY2lvdXMgZWZmZWN0IG9uIHNvY2lldHk7IGJ5IHRha2luZyBwb3NpdGlvbnMgaW4gZWR1Y2F0aW9uIHRoZXNlIHByb2Zlc3NvcnMgd2lsbCBncmVhdGx5IGltcGFjdCB0aGUgZnV0dXJlIG9mIHRoZSBjb3VudHJ5LiBJbmRvY3RyaW5hdGluZyB0aGUgeW91dGggYWxsb3dzIG9uZSB0byBjaGFuZ2UgdGhlIGNvdXJzZSBvZiB0aGUgZnV0dXJlLiAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpkYXRhQTkgPC0gc2VsZWN0KGRhdGEsIHllYXIsIGNvbGNvbSwgcG9sdmlld3MpICU+JSBmaWx0ZXIoIWlzLm5hKGNvbGNvbSksICFpcy5uYShwb2x2aWV3cyksIHBvbHZpZXdzID09IDEgfCBwb2x2aWV3cyA9PSAyIHwgcG9sdmlld3MgPT0gMyB8IHBvbHZpZXdzID09NCB8IHBvbHZpZXdzID09IDUgfCBwb2x2aWV3cyA9PSA2IHwgcG9sdmlld3MgPT0gNykKZGF0YUE5IDwtIG11dGF0ZShkYXRhQTksIGNvbGNvbSA9IGlmZWxzZShjb2xjb20gPT0gNSwgMSwgMCkpICU+JSBtdXRhdGUocG9sdmlld3MgPSBpZmVsc2UocG9sdmlld3MgPT0gMXxwb2x2aWV3cyA9PTJ8cG9sdmlld3MgPT0zLCAiTGliZXJhbCIsIGlmZWxzZShwb2x2aWV3cyA9PSA1fHBvbHZpZXdzID09Nnxwb2x2aWV3cyA9PTcsICJDb25zZXJ2YXRpdmUiLCBpZmVsc2UocG9sdmlld3MgPT0gNCwgIk1vZGVyYXRlIiwgInBvbHZpZXdzIikpKSkKCnRhYmxlX05vdF9maXJlZCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBOSwgeWVhciwgcG9sdmlld3MpLCBwZXJjZW50YWdlID0gbWVhbihjb2xjb20pKSkKCmdncGxvdCh0YWJsZV9Ob3RfZmlyZWQpICsgCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlLCBjb2xvciA9IHBvbHZpZXdzKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiUXVlc3Rpb246IFNob3VsZCBjb21tdW5pc3QgdGVhY2hlciBiZSBmaXJlZCIsIHN1YnRpdGxlID0gIlJlc3BvbnNlOiBOb3QgRmlyZWQiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygicmVkIiwgImJsdWUiLCAiZGFyayBncmV5IikpCmBgYAoKCiMjIyBJcyBpdCB3cm9uZyBmb3Igc2FtZS1zZXggYWR1bHRzIHRvIGhhdmUgc2V4dWFsIHJlbGF0aW9ucz8KV2Ugd2lsbCBzZWUgdGhlIHBlcmNlbnRhZ2Ugb2YgcmVzcG9uZGVudHMgb2YgZWFjaCBwYXJ0eSBvdmVyIHRoZSB5ZWFycy4KU2ltaWxhciB0byBvdXIgcHJldmlvdXMgZmluZGluZ3MsIGluIHRoaXMgZmlndXJlIHdlIGNhbiBvYnNlcnZlIHRoYXQgdGhlcmUgaXMgYSBpbmNyZWFzZSBvZiBhY2NlcHRhbmNlIHJlZ2FyZGluZyBsaWJlcmFsIGlkZWFzOyBpdCBpcyBzZWxmLWV2aWRlbnQgdGhhdCBhbGwgcG9saXRpY2FsIHBhcnRpZXMgaGF2ZSBvdmVyIHRoZSB5ZWFycyBncm93biBtb3JlIGxlZnRpc3QuIEhlcmUsIGFsbCB0aHJlZSBwYXJ0aWVzIGhhdmUgZ3Jvd24gc2lnbmlmaWNhbnRseSBpbiBwZXJjZW50YWdlIHJlZ2FyZGluZyB0aGUgYWNjZXB0YW5jZSBvZiBzYW1lLXNleCByZWxhdGlvbnMuIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGF0YUExMCA8LSBzZWxlY3QoZGF0YSwgeWVhciwgaG9tb3NleCwgcG9sdmlld3MpICU+JSBmaWx0ZXIoIWlzLm5hKGhvbW9zZXgpLCAhaXMubmEocG9sdmlld3MpLCBwb2x2aWV3cyA9PSAxIHwgcG9sdmlld3MgPT0gMiB8IHBvbHZpZXdzID09IDMgfCBwb2x2aWV3cyA9PTQgfCBwb2x2aWV3cyA9PSA1IHwgcG9sdmlld3MgPT0gNiB8IHBvbHZpZXdzID09IDcpCmRhdGFBMTAgPC0gbXV0YXRlKGRhdGFBMTAsIGhvbW9zZXggPSBpZmVsc2UoaG9tb3NleCA9PSA0LCAxLCAwKSkgJT4lIG11dGF0ZShwb2x2aWV3cyA9IGlmZWxzZShwb2x2aWV3cyA9PSAxfHBvbHZpZXdzID09Mnxwb2x2aWV3cyA9PTMsICJMaWJlcmFsIiwgaWZlbHNlKHBvbHZpZXdzID09IDV8cG9sdmlld3MgPT02fHBvbHZpZXdzID09NywgIkNvbnNlcnZhdGl2ZSIsIGlmZWxzZShwb2x2aWV3cyA9PSA0LCAiTW9kZXJhdGUiLCAicG9sdmlld3MiKSkpKQoKdGFibGVfTm90X3dyb25nX2F0X2FsbCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBMTAsIHllYXIsIHBvbHZpZXdzKSwgcGVyY2VudGFnZSA9IG1lYW4oaG9tb3NleCkpKQoKZ2dwbG90KHRhYmxlX05vdF93cm9uZ19hdF9hbGwpICsgCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlLCBjb2xvciA9IHBvbHZpZXdzKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIAogIGxhYnModGl0bGUgPSAiUXVlc3Rpb246IElzIGl0IHdyb25nIGZvciBzYW1lLXNleCBhZHVsdHMgdG8gaGF2ZSBzZXh1YWwgcmVsYXRpb25zIiwgc3VidGl0bGUgPSAiUmVzcG9uc2U6IE5vdCB3cm9uZyBhdCBhbGwiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygicmVkIiwgImJsdWUiLCAiZGFyayBncmV5IikpCmBgYCAKCgojIyMgSXMgaXQgd3JvbmcgdG8gaGF2ZSBzZXggYmVmb3JlIG1hcnJpYWdlPwpXZSB3aWxsIHNlZSB0aGUgcGVyY2VudGFnZSBvZiByZXNwb25kZW50cyBvZiBlYWNoIHBhcnR5IG92ZXIgdGhlIHllYXJzLgpBZ2Fpbiwgbm90IHN1cnByaXNpbmdseSwgd2UgZmluZCB0aGF0IGFsbCB0aHJlZSBwYXJ0aWVzIGhhdmUgbGVhbmVkIHRvd2FyZHMgYSBtb3JlIGxpYmVyYWwgbWluZHNldCBvdmVyIHRoZSB5ZWFycy4gQ29uc2VydmF0aXZlcyBhbmQgbW9kZXJhdGVzIGFsaWtlIGhhdmUgZ3Jvd24gdG8gYWNjZXB0IHRoZSBsaWJlcmFsIGlkZWEgb2Ygc2V4dWFsIGZyZWVkb20gYW5kIHByb21pc2N1aXR5LiBUaGUgcGVyY2VudGFnZSBvZiBjb25zZXJ2YXRpdmUgYWNjZXB0YW5jZSBvZiBzZXggYmVmb3JlIG1hcnJpYWdlIGluIDIwMTggaXMgZXF1aXZhbGVudCB0byB0aGUgYWNjZXB0YW5jZSBwZXJjZW50YWdlIG9mIGxpYmVyYWxzIGluIHRoZSAxOTcwcy4gCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkYXRhQTExIDwtIHNlbGVjdChkYXRhLCB5ZWFyLCBwcmVtYXJzeCwgcG9sdmlld3MpICU+JSBmaWx0ZXIoIWlzLm5hKHByZW1hcnN4KSwgIWlzLm5hKHBvbHZpZXdzKSwgcG9sdmlld3MgPT0gMSB8IHBvbHZpZXdzID09IDIgfCBwb2x2aWV3cyA9PSAzIHwgcG9sdmlld3MgPT00IHwgcG9sdmlld3MgPT0gNSB8IHBvbHZpZXdzID09IDYgfCBwb2x2aWV3cyA9PSA3KQpkYXRhQTExIDwtIG11dGF0ZShkYXRhQTExLCBwcmVtYXJzeCA9IGlmZWxzZShwcmVtYXJzeCA9PSA0LCAxLCAwKSkgJT4lIG11dGF0ZShwb2x2aWV3cyA9IGlmZWxzZShwb2x2aWV3cyA9PSAxfHBvbHZpZXdzID09Mnxwb2x2aWV3cyA9PTMsICJMaWJlcmFsIiwgaWZlbHNlKHBvbHZpZXdzID09IDV8cG9sdmlld3MgPT02fHBvbHZpZXdzID09NywgIkNvbnNlcnZhdGl2ZSIsIGlmZWxzZShwb2x2aWV3cyA9PSA0LCAiTW9kZXJhdGUiLCAicG9sdmlld3MiKSkpKQoKdGFibGVfTm90X3dyb25nX2F0X2FsbCA8LSB0aWJibGUoc3VtbWFyaXNlKGdyb3VwX2J5KGRhdGFBMTEsIHllYXIsIHBvbHZpZXdzKSwgcGVyY2VudGFnZSA9IG1lYW4ocHJlbWFyc3gpKSkKCmdncGxvdCh0YWJsZV9Ob3Rfd3JvbmdfYXRfYWxsKSArIAogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB5ZWFyLCB5ID0gcGVyY2VudGFnZSwgY29sb3IgPSBwb2x2aWV3cykpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBsYWJzKHRpdGxlID0gIlF1ZXN0aW9uOiBJcyBpdCB3cm9uZyB0byBoYXZlIHNleCBiZWZvcmUgbWFycmlhZ2UiLCBzdWJ0aXRsZSA9ICJSZXNwb25zZTogTm90IHdyb25nIGF0IGFsbCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJyZWQiLCAiYmx1ZSIsICJkYXJrIGdyZXkiKSkKYGBgCgoKIyMgUXVlc3Rpb24gIzQ6ICBMaW5lYXIgbW9kZWwgcHJlZGljdGluZyBwb2x2aWV3cwpIZXJlIHdlIGNyZWF0ZWQgYSBsaW5lYXIgbW9kZWwgdG8gcHJlZGljdCBwb2x2aWV3cyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOiBiaWJsZSwgZ3Jhc3MgKG1hcmlqdWFuYSksIGhvbW9zZXgsIGFiYW55IChhYm9ydGlvbiksIGFuZCBjb2xjb20uIEluIHRoaXMgbGluZWFyIG1vZGVsIHdlIGdldCBhbiBSLXNxdWFyZWQgdmFsdWUgb2YgMC4xNDQgd2hpY2ggYWdyZWVzIHdpdGggb3VyIHByZXZpb3VzIGZpbmRpbmdzLiAKCmBgYHtyfQpkYXRhIDwtIGZpbHRlcihkYXRhLCBwb2x2aWV3cyA9PSAxIHwgcG9sdmlld3MgPT0gMiB8IHBvbHZpZXdzID09IDMgfCBwb2x2aWV3cyA9PTQgfCBwb2x2aWV3cyA9PSA1IHwgcG9sdmlld3MgPT0gNiB8IHBvbHZpZXdzID09IDcpCnBvbHZpZXdzX2ZpdCA8LSBsaW5lYXJfcmVnKCkgJT4lIHNldF9lbmdpbmUoImxtIikgJT4lIGZpdChwb2x2aWV3cyB+IGJpYmxlICsgZ3Jhc3MgKyBob21vc2V4ICsgYWJhbnkgKyBjb2xjb20gLCBkYXRhKQpwb2x2aWV3c19maXQgJT4lIHRpZHkoKQoKZ2xhbmNlKHBvbHZpZXdzX2ZpdCkkYWRqLnIuc3F1YXJlZAkKYGBgCgoKIyBDb25jbHVzaW9uCgpUaGUgR1NTIGdhdGhlcnMgaW5mb3JtYXRpb24gZnJvbSBjb250ZW1wb3JhcnkgQW1lcmljYW4gU29jaWV0eSBpbiBvcmRlciB0byBtb25pdG9yIGFuZCBleHBsYWluIHRyZW5kcyBhbmQgY2hhbmdlcyBpbiBhdHRpdHVkZXMsIGJlaGF2aW9ycywgYW5kIGF0dHJpYnV0ZXMuIFRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBHU1MgaW52ZW50aXZlbHkgY2FsbHMgZm9yIGEgbXlyaWFkIG9mIHF1ZXN0aW9ucy4gSW4gdGhpcyBleHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzIChFREEpIHdlIHV0aWxpemVkIGEgdmFyaWV0eSBvZiBmdW5jdGlvbnMgYW5kIHBhY2thZ2VzIHRvIGFuc3dlciBzb21lIHF1ZXN0aW9ucyB3aGljaCB3ZSBkZWVtZWQgaW50ZXJlc3RpbmcgYW5kIGRpZGFjdGljLiAKCk91ciBmaXJzdCBxdWVzdGlvbiBhaW1lZCB0byBkZXNjcmliZSBhbmQgdmlzdWFsaXplIHRoZSBjaGFuZ2UgaW4gcG9saXRpY2FsIHBhcnRpZXMgb3ZlciB0aGUgeWVhcnMuIEZpcnN0LCB3ZSBoYWQgdG8gY2xlYW4gdGhlIGRhdGEgYW5kIG1ldGhvZGljYWxseSBvcmdhbml6ZSBpdCBpbiBhIG1vcmUgc3VjY2luY3QgYW5kIHVuZGVyc3RhbmRhYmxlIG1hbm5lci4gVGhlbiwgdXRpbGl6aW5nIHBlcnN1YXNpdmUgZ3JhcGhpbmcgdG9vbHMgd2Ugd2VyZSBhYmxlIHRvIG9ic2VydmUgdGhlIGNoYW5nZSBpbiBwcm9wb3J0aW9uIG9mIHRoZSBwb2xpdGljYWwgcGFydGllcyAoTGliZXJhbCwgQ29uc2VydmF0aXZlLCBNb2RlcmF0ZSkgb3ZlciB0aGUgeWVhcnMgKDE5NzQtMjAxOCkuIEl0IGJlY2FtZSBldmlkZW50IHRoYXQgdGhvdWdoIHRoZSBwcm9wb3J0aW9uIGRpZCBmYWNlIHNvbWUgZmx1Y3R1YXRpb25zIG92ZXIgdGhlIHllYXJzLCBpdCBuZXZlcnRoZWxlc3MgbWFpbnRhaW5lZCBhIGNvbnN0YW50IHJhdGUuIFRoYXQgaXMgdG8gc2F5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHBlb3BsZSB3aXRoIGRpZmZlcmluZyBwb2xpdGljYWwgdmlld3MgZGlkbuKAmXQgdW5kZXJnbyBhIGdyZWF0IGNoYW5nZSBvdmVyIHRoZSBzcGFuIG9mIDQ0IHllYXJzLiAKClRob3VnaCB0aGUgRURBIGNvbmR1Y3RlZCBpbiBxdWVzdGlvbiBvbmUgc3VnZ2VzdGVkIGEgc2Vuc2Ugb2Ygc3RhYmlsaXR5IGluIHRoZSBwb2xpdGljYWwgZmllbGQsIHdlIG1haW50YWluZWQgc29tZSBza2VwdGljaXNtIGFuZCB3YW50ZWQgdG8gZnVydGhlciBleHBsb3JlIHRoZSBjaGFuZ2Ugb2YgcG9saXRpY2FsIHZpZXdzIG92ZXIgdGhlIHllYXJzLiBQYXJ0aWN1bGFybHksIHdlIGFpbWVkIHRvIHByb2JlIG1vcmUgZGVlcGx5IGludG8gdGhlIGRhdGEgYXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgd2VyZSBhbnkgdHJlbmRzIHRvd2FyZHMgdGhlIGxpYmVyYWwgcG9saXRpY2FsIHZpZXcuIFRoZSBhZm9yZW1lbnRpb25lZCBpcyBwcmVjaXNlbHkgd2hhdCB3ZSBhaW1lZCB0byBhbnN3ZXIgaW4gcXVlc3Rpb24gdHdvLiBJLmUuIHdoZXRoZXIgcGVvcGxlLCBhcyBhIHdob2xlLCBhcmUgbGVhbmluZyB0b3dhcmRzIGxpYmVyYWwgaWRlYXMuCgpJbiBvdXIgRURBIG9mIHRoZSBsYXR0ZXIgcXVlcnkgd2UgaW5kZWVkIGZvdW5kIHRoYXQgcGVvcGxlIGFyZSBjb2xsZWN0aXZlbHkgbGVhbmluZyB0b3dhcmRzIGxpYmVyYWwgaWRlYXMuIFdlIGlkZW50aWZpZWQgYW5kIHZpc3VhbGl6ZWQgdGhlIHRyZW5kIG9mIGxpYmVyYWwgb3BpbmlvbiBpbiB0aGUgZm9sbG93aW5nIHRvcGljczogaG9tb3NleHVhbGl0eSwgcmVsaWdpb24gKGJpYmxlKSwgbWFyaWp1YW5hIGxlZ2FsaXphdGlvbiwgYWJvcnRpb24sIGNvbW11bmlzdCBlZHVjYXRvcnMsIGFzIHdlbGwgYXMgZm9ybmljYXRpb24gKHNleHVhbCBpbnRlcmNvdXJzZSBiZWZvcmUgbWFycmlhZ2UpLiBJbiBzb21lIG9mIHRoZXNlIHRyZW5kcyB3ZSBvYnNlcnZlZCBwZXJjZW50YWdlIGNoYW5nZXMgYXMgaGlnaCBhcyA0MCUsIGFzIGluIHRoZSBjYXNlIG9mIG1hcmlqdWFuYSBsZWdhbGl6YXRpb24uIFdoaWxlIDIwJSBvZiBwZW9wbGUgaW4gMTk3NCBhcHByb3ZlZCBvZiBtYXJpanVhbmEgbGVnYWxpemF0aW9uLCB0aGUgcGVyY2VudGFnZSBlc2NhbGF0ZWQgdG8gb3ZlciA2MCUgaW4gMjAxOC4gCgpVcG9uIGFycml2aW5nIHRvIHRoZXNlIGZpbmRpbmdzLCB3ZSBkZWNpZGVkIHRvIGRlbHZlIGRlZXBlciBpbnRvIHRoZSBkYXRhIGFuZCBleHBsb3JlIHRoZXNlIHRyZW5kcyBmcm9tIGFub3RoZXIgdmlldyBwb2ludC4gUmF0aGVyIHRoYW4gYXNraW5nIHdoZXRoZXIgcGVvcGxlIHdlcmUgbGVhbmluZyBtb3JlIHRvd2FyZHMgbGliZXJhbCBpZGVhcywgd2UgYWltZWQgdG8gc2VlIHdoZXRoZXIgcGVvcGxlIHdlcmUgbGVhdmluZyBjb25zZXJ2YXRpdmUgaWRlYXMgYW5kIHZhbHVlcy4gQ29tcGFyYWJsZSB0byBxdWVzdGlvbiB0aHJlZSwgd2UgYXBwcm9hY2hlZCB0aGUgZGF0YSBzaW1pbGFybHksIGFuZCBhaW1lZCB0byBzZWUgdGhlIHRyZW5kcyBvZiBjaGFuZ2Ugb3ZlciB0aGUgeWVhcnMgZ2l2ZW4gdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBxdWVzdGlvbiB0aHJlZS4gCgpXZSBmb3VuZCB0aGF0IGZyb20gdGhpcyBwb2ludCBvZiBhbmFseXNpcyB0aGUgc2FtZSBjb25jbHVzaW9uIHdhcyBzdGlsbCBtYWludGFpbmVkOiBwZW9wbGUgYXJlIGxlYW5pbmcgdG93YXJkcyBsaWJlcmFsIGlkZWFscy4gV2UgaWRlbnRpZmllZCB0aGF0IGl0IGlzIG5vdCBvbmx5IGNvbnNlcnZhdGl2ZXMgdGhhdCBhcmUgbGVhbmluZyBtb3JlIGxlZnQsIGJ1dCBldmVuIG1vZGVyYXRlcywgYW5kIGxpYmVyYWxzIHRoZW1zZWx2ZXMgaGF2ZSBzaGlmdGVkIGxlZnQgd2hlbiBjb21wYXJlZCB0byB0aGVpciAxOTc0IGNvdW50ZXJwYXJ0cy4gSW4gc29tZSBjYXNlcywgc3VjaCBhcyB3aGVuIGZhY2VkIHdpdGggdGhlIGZvcm5pY2F0aW9uIHRvcGljLCB3ZSBmb3VuZCB0aGF0IGNvbnNlcnZhdGl2ZXMgaW4gMjAxOCBoYWQgdGhlIHNhbWUgcGVyY2VudGFnZSBvZiBhY2NlcHRhbmNlIG9mIGV4dHJhbWFyaXRhbCBzZXggYXMgZGlkIHRoZSBsaWJlcmFscyBpbiB0aGUgMTk4MHMuICAKCkdpdmVuIHRoZXNlIGZpbmRpbmdzLCB3ZSBkZWNpZGVkIHRvIGNyZWF0ZSBhIGxpbmVhciBtb2RlbCB0byBkZW1vbnN0cmF0ZSB0aGUgc3RyZW5ndGggb2YgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgcGFyYW1ldGVycyBpbnZlc3RpZ2F0ZWQgYW5kIHRoYXQgb2YgcG9saXRpY2FsIHZpZXdwb2ludC4gVGhlIFItc3F1YXJlIHZhbHVlIHdhcyB0aGF0IG9mIDAuMTQ0LCBhIHZlcnkgaW5zaWduaWZpY2FudCBhbW91bnQuIEhvd2V2ZXIsIHRoaXMgdmFsdWUgZnVydGhlciB2ZXJpZmllcyB0aGF0IG91ciBFREEgd2FzIGZydWl0ZnVsLiBWaXosIHRoZSBsb3cgUi1zcXVhcmVkIHZhbHVlIGltcGxpZXMgdGhhdCB0aGVzZSBwYXJhbWV0ZXJzIGFzc2VydCBhIHJhdGhlciBzbWFsbCBhbW91bnQgb2YgaW5mbHVlbmNlIHRvIHRoYXQgb2YgcG9saXRpY2FsIHZpZXdzLiBXaGF0IHRoaXMgaW1wbGllcyBpcyB0aGF0IGFsbCB0aHJlZSBwb2xpdGljYWwgdmlld3MgaGF2ZSBza2V3ZWQgbGVmdCB0b3dhcmRzIGxpYmVyYWwgaWRlYXMgaW4gdGhlIHBhc3QgNDQgeWVhcnMuIAoKSW4gY29uY2x1c2lvbiwgdGhlIGZpbmRpbmdzIGluIHRoaXMgRURBIHNlZW0gdG8gc3VnZ2VzdCB0aGF0IGluIHRoZSBwYXN0IDQ0IHllYXJzLCBmcm9tIDE5NzQgdG8gMjAxOCwgcHVibGljIG9waW5pb24gYW5kIHZhbHVlcyBoYXZlIHNpZ25pZmljYW50bHkgaW5jbGluZWQgbGVmdDsgbGVhbmluZyB0b3dhcmRzIGEgbW9yZSBsaWJlcmFsIHZpZXdwb2ludC4gCg==